golang_我的第一个golang程序
字数
773 字
阅读时间
4 分钟
更新日期
12/22/2018
Python自己认为已经学习的差不多了,是时候尝试其他语言了,首选就是golang,跨平台和原生的并发支持吸引到了我。当然,最开始学习golang的时候,一些语法什么和python大相径庭,让我吃屎一样难受,最开始学习python的时候也是吃屎一样难受。就这样学习了几天,直至写出了我的第一个golang程序,才感受到了golang的美好~
goWhatweb
初步想法是用go重写cms识别来替换在线cms识别网站的内核。在线cms识别其实已经很稳定了,但是一些指纹的版本比较老,一些算法的优化还是不到位,所以就期待用go重写一下来解决这些问题。
第一个Golang程序
这个程序只是解决了指纹在导入过程中,转换为golang识别的数据结构,然后通过算法得出最佳的排列方式。流程类似这样:
go
// 原始cms样式:
//{
// "gowinsoft_jw": [{
// "path": "/web/web/web/images/4bt1.jpg",
// "option": "md5",
// "content": "ef1ee9c8708cde1bd25a90054de85690"
//}, {
// "path": "/web/web/web/images/4_13.jpg",
// "option": "md5",
// "content": "577c2578f9df10fefe7aa62df1e125ae"
//}, {
// "path": "/images/wtop.gif",
// "option": "md5",
// "content": "8f054dfdc67125dc96b209d928de0b9d"
//}],
//"万博网站管理系统": [{
//"path": "/system/Images/Login_Bottom.jpg",
//"option": "md5",
//"content": "9e88927b8895f2798c2de99e028f6b98"
//}],
//"maticsoftsns": [{
//"path": "/msgbox/images/gb_tip_layer.png",
//"option": "md5",
//"content": "c8cb16e8b61bc549ebd339858e66fa5c"
//}, {
//"path": "/admin/images/txt_bg2.gif",
//"option": "md5",
//"content": "ef572c58513148310268e492fb0276ed"
//}, {
//"path": "/admin/js/msgbox/images/loading.gif",
//"option": "md5",
//"content": "20ac34e039a3224281a38e9222137815"
//}],
//"klemanndesign": [{
//"path": "/script/lightbox2.4/scriptaculous.js",
//"option": "md5",
//"content": "THE SOFTWARE IS PROVIDED \"AS IS\""
//}, {
//"path": "/themes/lightbox/closelabel.gif",
//"option": "md5",
//"content": "0e5462b0b4f00432eac4b33d5fa31c5a"
//}],
// 将指纹按照访问路径排序,并且用访问路径来识别
//{
// "/":{singcms{},singcms{},},
// "/robots.txt":{singcms{},singcms{},},
//}
// 在生成一个数组,用于排序
//{
// "/":100,
// "/robots.txt":99
//}
// 筛选出排序优先级,根据优先级的路径来访问地址
源代码如下:
go
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"sort"
)
type singcms struct {
Path string
Option string
Content string
Name string
}
type Pair struct {
Path string
length int
}
// A slice of Pairs that implements sort.Interface to sort by Value.
type PairList []Pair
func (p PairList) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func (p PairList) Len() int { return len(p) }
func (p PairList) Less(i, j int) bool { return p[i].length > p[j].length }
func sortMapByValue(m map[string]int) PairList {
p := make(PairList, len(m))
i := 0
for k, v := range m {
p[i] = Pair{k, v}
i++
}
sort.Sort(p)
return p
}
func main() {
s, err :=ioutil.ReadFile("cms.json")
if(err != nil){
panic(err)
}
var f map[string][]singcms
err = json.Unmarshal(s, &f)
webdata:=make(map[string][]singcms)
for k,v := range f{
//_,ok := webdata[k]
//
//if(!ok){
// webdata[k] = make([]singcms,len(v))
//}
//
for _,data := range v{
path:=data.Path
_,ok := webdata[path]
if(!ok){
webdata[path] = make([]singcms,0)
}
data.Name = k
webdata[path] = append(webdata[path],data)
}
}
sortdata := make(map[string]int)
for k,v := range webdata{
sortdata[k] = len(v)
}
fmt.Println(sortMapByValue(sortdata))
}
End
当然这并不是我认为的最好的cms识别方式,之前有篇文章我构想通过“决策树”来识别,我觉得这才是快速识别的关键,但是场景可能不同吧,现在收集到的指纹数量才1800+,实际访问路径大约1600(好像也挺高了。。),总之基于决策树查询的话每个指纹的制作会比较复杂和繁琐…